import 'package:dsbridge_flutter/dsbridge_flutter.dart';
import 'package:ecy_app_flutter/ecycommon/EcyCommonWidgets.dart';
import 'package:ecy_app_flutter/ecycommon/EcyEventBus.dart';
import 'package:ecy_app_flutter/ecycommon/JsApi.dart';
import 'package:ecy_app_flutter/ecycommon/utils/EcyLogger.dart';
import 'package:ecy_app_flutter/routes/goods/model/EcyGoodsSkuModel.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_jsbridge_sdk/flutter_jsbridge_sdk.dart';
import 'package:webview_flutter/webview_flutter.dart';
// Import for Android features.
import 'package:webview_flutter_android/webview_flutter_android.dart';
// Import for iOS/macOS features.
import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart';

import '../constant/EcyEventConsnt.dart';

class EcyWebViewPage extends EcyCommonBaseWidget {
  final String h5Url;
  final String h5Title;
  EcyWebViewPage(this.h5Url, this.h5Title);
  @override
  _EcyWebViewPageState createState() {
    return _EcyWebViewPageState(this.h5Url, this.h5Title);
  }
}

class _EcyWebViewPageState extends EcyCommonBaseWidgetState {
  final String h5Url;
  final String h5Title;
  late final PlatformWebViewControllerCreationParams params;
  late DWebViewController controller;
  _EcyWebViewPageState(this.h5Url, this.h5Title);
  void initState() {
    super.initState();
    _initWebViewController();
    registerEvents();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: SafeArea(
        child: WebViewWidget(controller: controller),
      ),
    );
  }

  @override
  void dispose() {
    // 清理控制器，避免内存泄漏
    super.dispose();
    controller.dispose();
    unregisterEvents();
  }

  // ///是否启用JavaScript执行，默认不启用
  // Future<void> setJavaScriptMode(JavaScriptMode javaScriptMode);
  // ///设置webview的背景色
  // Future<void> setBackgroundColor(Color color);
  // /// 当WebView的导航状态发生变化时会回调此方法，在此法中可以进行跳转拦截；
  // /// 这里的 NavigationDecision.prevent表示阻止路由替换，NavigationDecision.navigate表示允许路由替换
  // Future<void> setNavigationDelegate(NavigationDelegate delegate);
  // ///加载一个URL
  // /// uri：可以通过Uri.parse(url)来将url转成uri
  // /// method：支持get请求和post请求两种，默认为get
  // /// headers：发起url加载是携带的header信息，根据请求的网站要求进行传递
  // /// body：发起url请求是携带的body信息，可空
  // Future<void> loadRequest(
  //     Uri uri, {
  //       LoadRequestMethod method = LoadRequestMethod.get,
  //       Map<String, String> headers = const <String, String>{},
  //       Uint8List? body,
  //     })
  // ///设置WebView 是否应支持使用其屏幕缩放控件和手势进行缩放，默认支持；
  // Future<void> enableZoom(bool enabled);
  // ///用于设置HTTP User-Agent: 请求标头的值
  // Future<void> setUserAgent(String? userAgent);
  // ///返回此 WebView 的历史记录。
  // /// 如果没有返回历史记录项，则这是一个无操作。
  // Future<void> goBack();
  // /// 返回 WebView 正在显示的当前 URL。
  // /// 如果没有加载过 URL，则返回 `null`。
  // Future<String?> currentUrl();
  // ///运行JS代码，javaScript，要运行的JS代码
  // Future<void> runJavaScript(String javaScript);
  // /// 运行JS代码并接收运行结果
  // /// javaScriptString：要运行的JS代码
  // /// 返回：JS运行的结果
  // Future<Object> runJavaScriptReturningResult(String javaScript);
  // /// 重新加载当前URL
  // Future<void> reload();
  // /// 判断是否可以返回历史记录的上一页
  // Future<bool> canGoBack();
  // /// 返回历史记录的上一页
  // Future<void> goBack();
  // /// 判断是否可以去往历史记录的下一页
  // Future<bool> canGoForward();
  // ///跳转到历史记录的下一页
  // Future<void> goForward();

  void _initWebViewController() async {
    if (WebViewPlatform.instance is WebKitWebViewPlatform) {
      params = WebKitWebViewControllerCreationParams(
        allowsInlineMediaPlayback: true,
        mediaTypesRequiringUserAction: const <PlaybackMediaTypes>{},
      );
    } else {
      params = const PlatformWebViewControllerCreationParams();
    }

    controller = DWebViewController.fromPlatformCreationParams(params);
// ···
    if (controller.platform is AndroidWebViewController) {
      AndroidWebViewController.enableDebugging(true);
      (controller.platform as AndroidWebViewController)
          .setMediaPlaybackRequiresUserGesture(false);
    }

    controller
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setBackgroundColor(const Color(0x00000000))
      ..setNavigationDelegate(
        NavigationDelegate(
          onProgress: (int progress) {
            // Update loading bar.
          },
          onPageStarted: (String url) {
            // 页面开始加载时移除旧的 JS 对象（如果存在）
            controller.removeJavaScriptObject('');
          },
          onPageFinished: (String url) {
            //页面加载完成后才能执行js
            controller.addJavaScriptObject(JsApi(this.context), namespace: '');
          },
          onWebResourceError: (WebResourceError error) {},
          onNavigationRequest: (NavigationRequest request) {
            return NavigationDecision.navigate;
          },
        ),
      );
    await controller.clearCache();
    await controller.clearLocalStorage();
    controller
      ..loadRequest(Uri.parse(h5Url))
      ..reload();
  }

  void unregisterEvents() {
    EcyEventBus().off(EcyEventConst.kAddressEdit, (arg) {});

    EcyEventBus().off(EcyEventConst.kLogined, (arg) {});
  }

  void registerEvents() {
    EcyEventBus().on(EcyEventConst.kAddressEdit, (arg) {
      EcyLogger.log("refreshAddress:");
      controller.callHandler('refreshAddress', args: [], handler: (retValue) {
        print(retValue.toString());
      });
    });

    EcyEventBus().on(EcyEventConst.kLogined, (arg) {
      EcyLogger.log("kLogined:");
      controller.callHandler('onAppLogined', args: [], handler: (retValue) {
        print(retValue.toString());
      });
    });
  }
}
